Forum des exercices du projet Zuul

Exercice 7.30

  
 
Avatar anonfirstname2 anonlastname2
Exercice 7.30
par anonfirstname2 anonlastname2, samedi 28 mars 2020, 23:15
 

Implement an extension that allows a player to pick up one single item. This includes implementing two new commands : take and drop.

Attention :
Ne cherchez pas dans cet exercice à autoriser plusieurs items portés par le joueur, ce sera le sujet de l'exercice suivant, une fois que take et drop fonctionneront parfaitement.

Ne pas oublier de lire les échanges ci-dessous pour mieux comprendre la bonne manière de réaliser cet exercice.

Avatar Thibaut TRASSART
Re: Exercice 7.30
par Thibaut TRASSART, dimanche 5 avril 2015, 15:55
 
Bonjour monsieur,


J'ai réussi à implémenter take et drop à un détail près : lorsque je prends un objet, il reste tout disponible dans la pièce. Je ne vois pas comment enlever un objet d'une pièce (ajout d'une méthode similaire à setItem() mais pour enlever un objet ?). Pouvez-vous m'indiquer comment faire ? Merci.


Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, dimanche 5 avril 2015, 17:00
 

Vous avez bien compris qu'il faut enlever l'Item de la Room.

Donc, il faut effectivement programmer une méthode removeItem qui, au lieu d'ajouter un Item à la HashMap comme dans addItem, enlèvera un Item de la HashMap.

Je vous rappelle que des ressources sont mises à votre disposition, dont un mini-cours esiee sur la HashMap.

Avatar Thibaut TRASSART
Re: Exercice 7.30
par Thibaut TRASSART, dimanche 5 avril 2015, 17:16
 

Merci beaucoup, j'ai réussi à créer la méthode

Avatar Maxime BLOIS
Re: Exercice 7.30
par Maxime BLOIS, samedi 9 mai 2015, 00:20
 

Bonjour,

Il faut bien créer les procédures take et drop dans la classe Player ?

Du coup je fais comment à chaque fois que je dois afficher juste une phrase par aGui.println(), je ne vais pas à chaque fois créer une méthode particulière dans la classe GameEngine juste pour afficher une phrase particulière ...?

Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, dimanche 10 mai 2015, 11:40
 

La réponse à votre 1ère question est simplement : oui.

Par contre, pour votre seconde question, je ne vois vraiment pas pourquoi il faudrait "créer une méthode particulière" pour chaque message puisque la méthode println peut afficher n'importe quel message.

De plus, je ne vois pas pourquoi créer même une seule méthode, puisque cette méthode existe déjà dans UserInterface.

Votre problème, je suppose, est tout simplement d'avoir accès à cette UserInterface, et donc de prévoir un attribut aGui dans Player, et surtout de l'initialiser correctement.

Avatar Maxime BLOIS
Re: Exercice 7.30
par Maxime BLOIS, dimanche 10 mai 2015, 21:09
 

C'est parce qu'il me semble que dans l'exercice précédent, on avait dit que Player n'avait pas à s'occuper des affichages,  cela devait être la tache de GameEngine uniquement (donc le aGui.println n'était présent que dans GameEngine)  ...  ?


Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, lundi 11 mai 2015, 11:22
 

Non, le Player n'a pas à s'occuper du "comment" ("Comment produit-on un affichage ?"), mais doit s'occuper du "quoi" ("Que veut-il afficher ?"). Les appels à println() ne posent donc aucun problème (à partir du moment où vous avez rendu la GUI accessible dans le Player).

Certains ont choisi de laisser les affichages dans GameEngine et leur Player se contente de produire une String à afficher. Cela ne fonctionne évidemment que si l'on a besoin que d'un seul affichage pour chaque commande ...
Relisez à cet égard ma dernière réponse à l'exercice 7.29 (dimanche 3 mai 2015, 18:49).

Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, jeudi 7 avril 2016, 13:12
 

Un étudiant a écrit :

Dans le but de créer ma commande "prendre", j'ai commencer à approfondir la facon de faire ,
je déclare tout d'abord une nouvelle commande mais par la suite je récupère le deuxième mot de la commande qui est le nom de l'item a récupèrer!

Je récupère donc une String, ma question est la suivante:

Comment puis je récupérer un objet Item à partir de la String récupèrer?

Je dois forcément la récupérer de ma HashMap mais je n'ai pas trouver comment l'utiliser en dehors du traitement de base effectuer dans les exercices antérieures

Je testerais par la suite si l'objet en question est présent dans aCurrentRoom

Si vous pouviez m'éclairer sur ma question 


Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, jeudi 7 avril 2016, 13:15
 

Si vous aviez à votre disposition une HashMap<String,Item> qui, à chaque nom d'item, associe l'Item correspondant,
il vous suffirait d'appeler la méthode qui retourne la valeur associée à une clé pour résoudre votre problème,
comme vous l'avez fait pour récupérer la Room qui est associée à chaque direction dans une pièce.

Avatar Charlotte COLBOIS RICHARD
Re: Exercice 7.30
par Charlotte COLBOIS RICHARD, samedi 9 avril 2016, 16:51
 

Bonjour, 

Je suis bloquée avec ma méthode take().

J'ai créé dans Player une liste d'items, car certaines de mes pièces comportent plusieurs items et je peux ainsi les ajouter/enlever de la liste avec les méthodes removeList et putList.

J'ai écrit la méthode take suivante : 

.../... code supprimé pour ne pas influencer les futurs lecteurs .../...

Cela compile, mais quand je tape la commande take nomItem dans le jeu, le terminal s'ouvre encore et cette phrase apparaîtrait :

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException

et me ramène à cette partie du code :

Items vItem = aPlayer.getRoom().getItems().get(vNom);


Que puis-je faire pour y remédier ? 

Merci. 

Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, samedi 9 avril 2016, 16:49
 

Il faut décomposer la ligne de l'erreur pour savoir quel morceau vaut null, ou ajouter des System.out.println :
- aPlayer ?
- aPlayer.getRoom() ?
- aPlayer.getRoom().getItems() ?

Ensuite (comme pour résoudre toute NullPointerException), il faudra chercher à "prouver" que chaque morceau ne peut pas valoir null.
Quand, pour l'un des morceaux, vous ne trouverez pas l'instruction qui aurait dû le rendre non null, vous comprendrez ce qu'il faut ajouter.

Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, 21 avril 2022, 20:14
 

Un étudiant a écrit :

Je bloque sur l’exo 7.30 je ne vois pas où placer take and drop.
Je l’ai mis dans le gameEngine cependant pleins de personnes me disent qu’ils faut les placer dans player par conséquent je suis un peu perdu.
Si vous pouvez m’éclairer là dessus.



Avatar Denis BUREAU
Re: Exercice 7.30
par Denis BUREAU, 21 avril 2022, 20:16
 

Ce n'est pas une question si simple.
Les méthodes addItem et removeItem doivent être dans Player (et dans Room !) puisqu'elles manipulent directement la HashMap d'items.
Maintenant, les méthodes qui gèrent les commandes take et drop ont bien sûr vocation à être dans la classe GameEngine comme pour toutes les autres commandes.